package com.atguigu.gmall;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author: 李旭
 * @create: 2021-08-31 16:07
 * <p>
 * 异步编排
 **/
public class CompletableFutureDemo2 {

    public static void main(String[] args) throws Exception {// 主线程
        //自定义线程池
        ThreadPoolExecutor threadPoolExecutor =
                new ThreadPoolExecutor(
                        5,//核心线程数
                        10,//最大线程数  5
                        5,//存活时间：超出核心线程数的线程的存活时间
                        TimeUnit.MINUTES,//单位
                        new ArrayBlockingQueue(10) //队列
                );

        //线程串行化      下一个任务依赖上一个任务
        //1:创建新线程
        CompletableFuture.supplyAsync(() -> {      //上一个任务
            try {
                TimeUnit.SECONDS.sleep(3);
                System.out.println("我是上一个任务");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "我是上一个任务的返回值";
        }, threadPoolExecutor).thenApplyAsync(t -> {//当前任务
            System.out.println(t);
            System.out.println("我是当前任务");
            return "我是当前任务的返回值";
        }, threadPoolExecutor).whenCompleteAsync((t, u) -> {//下一个任务
            System.out.println("下一个任务：t:" + t);
            System.out.println("下一个任务：u:" + u);
        }, threadPoolExecutor);
/*        我是上一个任务
                我是当前任务
        下一个任务：t:我是当前任务的返回值
        下一个任务：u:null*/

    }
}
